home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / arcers / gzipsrc.zip / GZIPSRC.TAR / gzip-1.2.4 / vms / vms.c < prev   
C/C++ Source or Header  |  1993-06-01  |  2KB  |  103 lines

  1. /* vms.c -- target dependent functions for VMS
  2.  * This is free software; you can redistribute it and/or modify it under the
  3.  * terms of the GNU General Public License, see the file COPYING.
  4.  *
  5.  * This file was written by Karl-Jose Filler <pla_jfi@pki-nbg.philips.de>
  6.  * and updated by Jean-loup Gailly.
  7.  */
  8.  
  9. #include <stdio.h>
  10.  
  11. static char **vms_argv = NULL;
  12.  
  13. static int max_files = 10000;
  14.  
  15. struct    Str_desc {
  16.     int     length;
  17.     char    *addr;
  18. };
  19.  
  20. vms_expand_args(old_argc, argv)
  21.     int *old_argc;
  22.     char **argv[];
  23. {
  24.     int        i;
  25.     int        new_argc = 0;
  26.     int        context, status;
  27.     char    buf[255], *p;
  28.     
  29.     vms_argv = (char**)xmalloc((max_files+1)*sizeof(char*));
  30.  
  31.     vms_argv[new_argc++] = **argv;
  32.  
  33.     for (i=1; i < *old_argc; i++) {
  34.     if (*argv[0][i] == '-') {   /* switches */
  35.         if (new_argc < max_files) {
  36.         vms_argv[new_argc++] = argv[0][i];
  37.         }
  38.     } else {            /* Files */
  39.         context = 0;
  40.         if (find_file_c(argv[0][i], buf, sizeof(buf), &context) & 1 != 1) {
  41.         /* 
  42.              * Wrong file ?
  43.          * forward it to gzip
  44.          */
  45.         if (new_argc < max_files) {
  46.             vms_argv[new_argc++] = argv[0][i];
  47.         }
  48.         } else {
  49.         p = (char*)xmalloc(strlen(buf)+1);
  50.         strcpy(p, buf);
  51.         if (new_argc < max_files) {
  52.             vms_argv[new_argc++] = p;
  53.         }
  54.         while (find_file_c(argv[0][i], buf, 
  55.                sizeof(buf), &context) & 1 == 1) {
  56.             p = (char*)xmalloc(strlen(buf)+1);
  57.             strcpy(p, buf);
  58.             if (new_argc < max_files) {
  59.             vms_argv[new_argc++] = p;
  60.             }
  61.         }
  62.         }
  63.     }
  64.     }
  65.     if (new_argc <= max_files) {
  66.     *old_argc = new_argc;
  67.     vms_argv[new_argc] = NULL;
  68.     *argv = vms_argv;
  69.     } else {
  70.     free(vms_argv); /* the expanded file names should also be freed ... */
  71.     vms_argv = NULL;
  72.     max_files = new_argc + 1;
  73.     vms_expand_args(old_argc, argv);
  74.     }
  75. }
  76.  
  77. int find_file_c(in,out,out_len,context)
  78.     char *in;
  79.     char *out;
  80.     int   out_len;
  81.     int  *context;
  82. {
  83.     struct    Str_desc in_desc,out_desc;
  84.     int        status;
  85.     char    *p;
  86.   
  87.     in_desc.addr = in;
  88.     in_desc.length = strlen(in);
  89.   
  90.     out_desc.addr = out;
  91.     out_desc.length = out_len;
  92.   
  93.     status = lib$find_file(&in_desc,&out_desc,context);
  94.  
  95.     p   = out_desc.addr;
  96.     while(*p != ' ') {
  97.     p++;
  98.     }
  99.     *p = 0;
  100.   
  101.     return status;
  102. }
  103.